全員がOAuth 2.0を理解しているチームの作り方 #devio2021
DevelopersIO 2021 Decade で「全員がOAuth 2.0を理解しているチームの作り方」というテーマで話させていただきました。
スライド
話した内容
なぜ人類は OAuth 2.0 に入門し続けるのか
なぜ OAuth 2.0 をチームに根付かせたいのか
- 開発フローとしてコードレビューがある
- 仕様がわからないと、レビューができない
- コードと仕様のすり合わせのために仕様が分かる必要がある
OAuth 2.0 はまあまあややこしい
OAuth 2.0 では登場人物が4人いて、それぞれがいろんなやりとりをします。
それぞれのやりとりにパラメーターがあるので、誰が誰にどういう値をどうして送る、みたいなところまで考えるとまあまあややこしいのですが、このややこしいシーケンスを完全に頭に入れると学習がスムーズに進むと思います。
勉強会について
以下をゴールに設定しました。
- 各ロールを説明できる
- 各グラントタイプのシーケンスをかける
- state 何?とかインプリシットグラントで OAuth 認証?をするとどうなるか?とかそのへんが説明できる
- 関連仕様を読める、読みながら実装できる
勉強会は基本的にある程度の区切りで一人ずつ交代で読む輪読会形式で開催しました。
使った書籍1(雰囲気でOAuth2.0を使っているエンジニアがOAuth2.0を整理して、手を動かしながら学べる本)
書籍で各グラントタイプのシーケンスを学習し、そのシーケンスを書きながら説明してもらう演習、を繰り返す勉強会を行いました。
具体的な勉強会の手順などはこちらを参照ください。 書籍の詳細な読書感想文はこちらを参照ください。
使った書籍2(OAuth、OAuth認証、OpenID Connectの違いを整理して理解できる本)
使った書籍3(OAuth・OIDCへの攻撃と対策を整理して理解できる本(リダイレクトへの攻撃編いろんな攻撃の手法と対策)
社内サービスへの攻撃を通じて勉強会の外に知見が広まる、というイベントがおきたりしました。
書籍の詳細な読書感想文はこちらを参照ください。
ここまでで OAuth 2.0 はなんとなくわかったが、仕様は?
仕様を読める人を増やすために、仕様を読んだことをある人を増やす必要を感じたので、仕様を読む会をやりました。
RFC 6749 (The OAuth 2.0 Authorization Framework) を読む会
いきなり読むと大変ですが、ここまでの勉強会を乗り越えたあとならいけるはず、というわけで、なんとかなりました。
具体的な勉強会の手順などはこちらを参照ください。
反省
輪読会じゃなくてみんながある程度読んだら勉強会を開催、としたらあんまり進まなかったので、これも輪読会でやったほうがよかったな、という反省がありました。
誰に参加してもらうか
いろんなアプリケーション/ロールをやっている人に参加してもらったほうがいろんな視点での会話ができるのでおもしろいと思います。 RFC などの文章を全く読んだことない人に参加してもらうことで、「読めば読めるじゃん」を体感してもらいます。
ここまでくると
仕様も読める、までクリアできると思います。
QA
今回の勉強会の対象人数はどの程度の人数で行いましたでしょうか。
勉強会によりますが 5人前後で行いました。 あまり人数が多いと輪読がだれたり演習が大変になると思うので、大人数でやる場合はチームを分けてやると良いと思います。
OAuth やってみて、結局昔ながらの Reverse Proxy 型 認証のほうがいいな、と感じるとこありましたか? 強制ログアウトとかはいかがでしたか?
サービスの提供形態として、認証、認可を行いたいアプリケーションの開発組織が複数にまたがることを前提にしており、そういう意味では OAuth 2.0/OIDC のがやりやすいのではないかと感じていますが、全サービスでセッションを完全に同期させたい、という要件があるのであればセッションの管理を一箇所にまとめたほうがやりやすいかもしれません。
OIDC でも RP から IdP に対してログアウトを要求する仕様がいくつかあります。Barista では一部しか対応してない & ちゃんと仕様を見れていないので正確なところはなんとも言えないのですが、認識している範囲だと全 RP の認証状態を完全に同期するのは仕様の範囲では難しい認識でいます。
- OpenID Connect Back-Channel Logout 1.0 - draft 06
- OpenID Connect Front-Channel Logout 1.0 - draft 04
- OpenID Connect RP-Initiated Logout 1.0 - draft 01
- OpenID Connect Session Management 1.0 - draft 30
「みんなで集まってガリガリ読む」とき、どのような流れで勉強会を実施しているのでしょうか。代表者が読んで認識合わせしていくのか、全員で一緒に?黙読して?認識合わせを進めていくのか、など。
ある程度の量で区切って一人ずつ交代で輪読する形式で勉強会を行っています。いきなり読むとわからないところはどうしても出てくるので、区切りごとに質問タイムを設けて都度都度認識合わせをしています。